package com.macro.mall.tiny.config;

import cn.hutool.json.JSON;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.module.SimpleModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.io.IOException;
import java.util.List;

/**
 * @author ZhuYi
 * @create 2024/3/20 20:58
 */
@Configuration
public class TableIdConfig implements WebMvcConfigurer {

    /**
     * 配置消息转换器
     * @param converters initially an empty list of converters
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        //converter是一个消息转换器的集合
        //MappingJackson2HttpMessageConverter 是用于 JSON 转换的转换器。
        //getObjectMapper() 方法获取转换器的 ObjectMapper 对象。SimpleModule 是用于注册自定义序列化器的模块。
        //addSerializer() 方法将自定义的 LongToStringSerializer 序列化器注册到模块中。
        //Long.class 和 long.class 是要进行序列化的类型。registerModule() 方法将自定义的模块注册到 ObjectMapper 中。
        converters.stream()
                .filter(converter -> converter instanceof MappingJackson2HttpMessageConverter)
                .findFirst()
                .ifPresent(converter -> {
                    MappingJackson2HttpMessageConverter jsonConverter =
                            (MappingJackson2HttpMessageConverter) converter;
                    ObjectMapper objectMapper = jsonConverter.getObjectMapper();
                    SimpleModule module = new SimpleModule();
                    module.addSerializer(Long.class, new LongToStringSerializer());
                    module.addSerializer(long.class, new LongToStringSerializer());
                    objectMapper.registerModule(module);
                });
    }

    /**
     * 自定义序列化器类
     */
    private static class LongToStringSerializer extends JsonSerializer<Object> {
        //serialize() 方法是重写的方法，用于对值进行序列化。
        //value 参数是要序列化的值。gen 是 JsonGenerator 对象，用于生成 JSON 数据。
        //writeString() 方法将值以字符串的形式写入 JSON。
        @Override
        public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            gen.writeString(String.valueOf(value));
        }
    }

    @Bean
    public WebMvcConfigurer webMvcConfigurer() {
        return new TableIdConfig();
    }
}
